#ifndef __MATH_OOB_HH__
#define __MATH_OON_HH__

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>

namespace math
{

//! @brief Oriented Bounding Box 类，x, z 方向可以旋转，y 不可以
class OOB
{
public:
    OOB(const glm::vec3& position, const glm::vec2& front, const glm::vec2& right, float height);
    ~OOB() noexcept = default;

    //! @brief 碰撞检测
    bool collide(const OOB& that) const
    { return OOB::collide(*this, that); }

    //! @brief 水平碰撞检测
    bool horizontalCollide(const OOB& that) const
    { return OOB::horizontalCollide(*this, that); }    

public:
    //! @brief 获取 vec 对 base 投影的长度
    static float projectionLength(const glm::vec2& vec, const glm::vec2& base);
    
    //! @brief 获取 front 与 right 对 base 投影长度综合（再加速 base 自身长度）
    static float projectionSumLength(const glm::vec2& front, const glm::vec2& right, const glm::vec2& base);
    
    //! @brief 碰撞检测
    static bool collide(const OOB& obj1, const OOB& obj2);

    //! @brief 水平碰撞检测
    static bool horizontalCollide(const OOB& obj1, const OOB& obj2);

private:
    //! @brief // 箱体位置
    glm::vec3 _position;  
    //! @brief 前向量
    glm::vec2 _front;
    //! @brief 右向量
    glm::vec2 _right;
    //! @brief 高度
    float _height;
};

}

#endif